﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Telerik.Web.UI;
using System.Collections;
using Proxy;
using System.Text;
using log4net;
using log4net.Config;
using log4net.Core;
using SIM.Util;

namespace SIM.Geo.UI.Geo
{
    public partial class frmLabor : PageBase
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                this.rgLista.ClientSettings.Scrolling.ScrollHeight = int.Parse(System.Configuration.ConfigurationManager.AppSettings["listaPrincipalScrollHeight"]);
                this.atxtNombre.Enabled = false;
                CargarCombos();
                Listar();
            }
            this.atxtNivel.Attributes.Add("onBlur", "return GenerarNivel();");
            this.atxtSeccion.Attributes.Add("onBlur", "return GenerarNivel();");
            this.txtDireccion.Attributes.Add("onBlur", "return GenerarNivel();");
            //this.ddlCategoria.Attributes.Add("onBlur", "return GenerarNivel();");

        }

        protected override void Listar()
        {
            try
            {
                using (var proxy = new SELaborClient("BasicHttpBinding_ISELabor"))
                {
                    var lista = proxy.Buscar1(this.txtNombreBuscar.Text.Trim());
                    this.rgLista.DataSource = lista;

                    this.rgLista.DataBind();
                }

            }
            catch (Exception ex)
            {

                Logger.Error("Labor:Listar", ex);

            }
        }

        private void CargarCombos()
        {
            try
            {
                using (var proxy = new SEZonaClient("BasicHttpBinding_ISEZona"))
                {
                    this.Bind(this.ddlZona, proxy.ObtenerListItem().ToList());
                    this.ddlZona.Items.Insert(0, new ListItem(Constantes.TipoSeleccion.SELECCIONE, TipoDropDownList.Seleccionar.GetHashCode().ToString()));
                }

                using (var proxy = new SECategoriaLaborClient("BasicHttpBinding_ISECategoriaLabor"))
                {
                    this.Bind(this.ddlCategoria, proxy.ObtenerListItem().ToList());
                    this.ddlCategoria.Items.Insert(0, new ListItem(Constantes.TipoSeleccion.SELECCIONE, TipoDropDownList.Seleccionar.GetHashCode().ToString()));
                }

                using (var proxy = new SETipoLaborClient("BasicHttpBinding_ISETipoLabor"))
                {
                    this.Bind(this.ddlTipoLabor, proxy.ObtenerListItem().ToList());
                    this.ddlTipoLabor.Items.Insert(0, new ListItem(Constantes.TipoSeleccion.SELECCIONE, TipoDropDownList.Seleccionar.GetHashCode().ToString()));
                }

                using (var proxy = new SEDireccionLaborClient("BasicHttpBinding_ISEDireccionLabor"))
                {
                    this.Bind(this.ddlDireccion, proxy.ObtenerListItem().ToList());
                    this.ddlDireccion.Items.Insert(0, new ListItem(Constantes.TipoSeleccion.SELECCIONE, TipoDropDownList.Seleccionar.GetHashCode().ToString()));
                }

                this.ddlCuadrante.Items.Add(new ListItem("1", "1"));
                this.ddlCuadrante.Items.Add(new ListItem("2", "2"));
                this.ddlCuadrante.Items.Add(new ListItem("3", "3"));
                this.ddlCuadrante.Items.Add(new ListItem("4", "4"));
                this.ddlCuadrante.Items.Insert(0, new ListItem(Constantes.TipoSeleccion.SELECCIONE, TipoDropDownList.Seleccionar.GetHashCode().ToString()));
            }
            catch (Exception ex)
            {

                Logger.Error("Labor:CargarCombos", ex);

            }
        }

        #region Mensajes
        protected override void MostrarMensajeValidacion(string mensaje)
        {
            this.pnlMensajeValidacion.Visible = true;
            this.lblMensajeValidacion.Text = mensaje;
        }

        protected override void OcultarMensajeValidacion()
        {
            this.pnlMensajeValidacion.Visible = false;
            this.lblMensajeValidacion.Text = string.Empty;
        }

        protected override void MostrarMensaje(string mensaje, enmTipoMensajeMostrar tipoMensaje = enmTipoMensajeMostrar.Informativa)
        {
            this.pnlMensaje.Visible = true;
            this.lblMensaje.Text = mensaje;
            this.pnlMensaje.CssClass = this.ObtenerEstiloMensaje(tipoMensaje);

        }

        protected override void OcultarMensaje()
        {
            this.pnlMensaje.Visible = false;
            this.lblMensaje.Text = string.Empty;
        }

        #endregion

        protected void rgLista_DeleteCommand(object sender, GridCommandEventArgs e)
        {
            OcultarMensaje();
            try
            {
                int codigoLabor = int.Parse(((GridDataItem)e.Item).GetDataKeyValue("CodigoLabor").ToString());

                try
                {
                    using (var proxy = new SELaborClient("BasicHttpBinding_ISELabor"))
                    {
                        proxy.Eliminar(codigoLabor);
                    }

                    MostrarMensaje(MSG_OK_ELIMINAR);
                }
                catch (Exception ex)
                {
                    Logger.Error("Labor:rgLista_DeleteCommand", ex);
                    MostrarMensaje(MSG_ERROR_ELIMINAR, enmTipoMensajeMostrar.Error);
                }

                Listar();
            }
            catch (Exception ex)
            {
                MostrarMensaje(MSG_ERROR_GENERICO, enmTipoMensajeMostrar.Error);
                Logger.Error("Labor:rgLista_DeleteCommand", ex);

            }
        }

        protected override void Limpiar()
        {
            this.hidCodigo.Value = "0";
            this.atxtNivel.Text = string.Empty;
            this.ddlZona.SelectedValue = TipoDropDownList.Seleccionar.GetHashCode().ToString();
            this.ddlCuerpo.SelectedValue = TipoDropDownList.Seleccionar.GetHashCode().ToString();
            this.atxtNombre.Text = string.Empty;
            this.atxtSeccion.Text = string.Empty;
            this.ddlCategoria.SelectedValue = TipoDropDownList.Seleccionar.GetHashCode().ToString();
            this.ddlTipoLabor.SelectedValue = TipoDropDownList.Seleccionar.GetHashCode().ToString();
            this.ddlDireccion.SelectedValue = TipoDropDownList.Seleccionar.GetHashCode().ToString();
            this.ddlCuadrante.SelectedValue = TipoDropDownList.Seleccionar.GetHashCode().ToString();

            OcultarMensaje();
            OcultarMensajeValidacion();

            this.txtDireccion.Text = string.Empty;
            this.txtDireccion.Visible = false;
            this.ddlDireccion.Visible = true;
        }

        private void CargarDatos(int codigoLabor)
        {
            try
            {
                using (var proxy = new SELaborClient("BasicHttpBinding_ISELabor"))
                {
                    var item = proxy.Obtener(codigoLabor);
                    if (item != null)
                    {
                        this.hidCodigo.Value = item.CodigoLabor.ToString();
                        this.atxtNivel.Text = item.Nivel;
                        this.ddlZona.SelectedValue = item.CodigoZona.ToString();
                        CargarCuerpo();

                        if (item.CodigoCuerpo != null)
                            this.ddlCuerpo.SelectedValue = item.CodigoCuerpo.ToString();
                        else
                            this.ddlCuerpo.SelectedValue = TipoDropDownList.Ninguno.GetHashCode().ToString();

                        this.atxtNombre.Text = item.NombreLabor;
                        this.atxtSeccion.Text = item.Seccion.ToString();
                        this.ddlCategoria.SelectedValue = item.CodigoCategoriaLabor.ToString();
                        this.ddlTipoLabor.SelectedValue = item.CodigoTipoLabor.ToString();
                        this.hidTipoLabor.Value = (item.TipoLabor != null) ? item.TipoLabor.NombreCorto : string.Empty;

                        if (item.CodigoDireccion != null)
                        {
                            this.ddlDireccion.SelectedValue = item.CodigoDireccion.ToString();
                            this.hidDireccion.Value = (item.DireccionLabor != null) ? item.DireccionLabor.DescripcionCorta : string.Empty; 
                        }
                        else
                        {
                            this.ddlDireccion.SelectedValue = TipoDropDownList.Seleccionar.GetHashCode().ToString();                            
                        }
                        this.ddlCuadrante.SelectedValue = item.Cuadrante.ToString();

                        if (this.ddlTipoLabor.SelectedValue.CompareTo(System.Configuration.ConfigurationManager.AppSettings["codigoTipoLaborChimenea"]) == 0)
                        {
                            this.txtDireccion.Text = item.DireccionChimenea.ToString();
                            this.ddlDireccion.Visible = false;
                            this.ddlDireccion.SelectedValue = TipoDropDownList.Seleccionar.GetHashCode().ToString();
                            this.txtDireccion.Visible = true;
                        }
                        else
                        {
                            this.ddlDireccion.Visible = true;
                            this.txtDireccion.Text = string.Empty;
                            this.txtDireccion.Visible = false;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Error("Labor:CargarDatos", ex);
            }
        }

        protected void rgLista_ItemCommand(object sender, GridCommandEventArgs e)
        {
            if (e.CommandName.CompareTo("Editar") == 0)
            {
                var item = ((GridEditableItem)e.Item);
                int codigoLabor = int.Parse(item.GetDataKeyValue("CodigoLabor").ToString());
                CargarDatos(codigoLabor);
                OcultarMensaje();
                OcultarMensajeValidacion();
                this.mpRegistro.Show();
            }
            if (e.CommandName == RadGrid.FilterCommandName)
            {
                Listar();
            }
        }

        protected void btnClose_Click(object sender, EventArgs e)
        {
            this.mpRegistro.Hide();
        }

        protected void imgClose_Click(object sender, ImageClickEventArgs e)
        {
            this.mpRegistro.Hide();
        }

        protected void rgLista_PageIndexChanged(object sender, GridPageChangedEventArgs e)
        {
            Listar();
        }

        protected void rgLista_SortCommand(object sender, GridSortCommandEventArgs e)
        {
            Listar();
        }

        protected void ibtnBuscar_Click(object sender, ImageClickEventArgs e)
        {
            this.Listar();
        }

        protected void ibtnExportar_Click(object sender, ImageClickEventArgs e)
        {
            try
            {
                Listar();
                string alternateText = "ExcelML";
                rgLista.ExportSettings.Excel.Format = (GridExcelExportFormat)Enum.Parse(typeof(GridExcelExportFormat), alternateText);
                rgLista.ExportSettings.IgnorePaging = true;
                rgLista.ExportSettings.ExportOnlyData = true;
                rgLista.ExportSettings.OpenInNewWindow = true;
                rgLista.MasterTableView.ExportToExcel();
            }
            catch (Exception ex)
            {

                Logger.Error("Labor:ibtnExportar_Click", ex);
            }
        }

        protected void ibtnRegistrar_Click(object sender, ImageClickEventArgs e)
        {
            Limpiar();
            this.mpRegistro.Show();
        }

        protected void ibtnGuardar_Click(object sender, ImageClickEventArgs e)
        {
            this.Guardar();
        }

        protected void ibtnCancelar_Click(object sender, ImageClickEventArgs e)
        {
            this.mpRegistro.Hide();
        }

        #region Metodos Sobreescribibles

        private void GenerarNombreLabor()
        {
            string nombreGenerado = string.Empty;
            try
            {
                if (int.Parse(this.ddlTipoLabor.SelectedValue) == 0 ||
                    this.atxtNivel.Text.Length == 0 || this.atxtSeccion.Text.Length == 0)
                {
                    nombreGenerado = string.Empty;
                }
                else
                {
                    string direccionChimenea = string.Empty;
                    if (this.ddlDireccion.SelectedValue.CompareTo("0") == 0 && this.txtDireccion.Text.Length > 0)
                        direccionChimenea = this.txtDireccion.Text.Trim();

                    string seccion = string.Empty;
                    seccion = this.atxtSeccion.Text.Trim();
                    using (var proxy = new SELaborClient("BasicHttpBinding_ISELabor"))
                    {

                        nombreGenerado = proxy.GenerarNombreLabor(int.Parse(this.ddlTipoLabor.SelectedValue),
                                                                    this.atxtNivel.Text, seccion,
                                                                    int.Parse(this.ddlDireccion.SelectedValue), direccionChimenea);
                    }
                }
            }
            catch (Exception ex)
            {

                Logger.Error("Labor:GenerarNombreLabor", ex);
            }
            this.atxtNombre.Text = nombreGenerado;
        }

        protected override bool Validar(ref  StringBuilder sb)
        {
            bool retorno = true;
            try
            {
                int nseccion = int.Parse(this.atxtSeccion.Text);
                int divisor = 10;
                if (nseccion % divisor != 0)
                {
                    sb.AppendLine("Sección ingresado no es válido, debe ser divisible entre 10. ");
                    retorno = false;
                }

                if (this.ddlTipoLabor.SelectedValue.CompareTo(System.Configuration.ConfigurationManager.AppSettings["codigoTipoLaborChimenea"]) == 0)
                {
                    if (this.txtDireccion.Text.CompareTo("") == 0)
                    {
                        sb.AppendLine("No ha ingresado dirección. ");
                        retorno = false;
                    }
                }
                else
                {
                    if (this.ddlDireccion.SelectedValue.CompareTo("0") == 0)
                    {
                        sb.AppendLine("No ha seleccionado dirección. ");
                        retorno = false;
                    }
                }

                if (!string.IsNullOrEmpty(this.atxtNombre.Text))
                {
                    bool validaNombre;
                    using (var proxy = new SELaborClient("BasicHttpBinding_ISELabor"))
                    {
                        if (this.ddlTipoLabor.SelectedValue.CompareTo(System.Configuration.ConfigurationManager.AppSettings["codigoTipoLaborChimenea"]) == 0)
                            validaNombre = proxy.ValidarNombreLabor1(this.atxtNombre.Text, int.Parse(this.hidCodigo.Value));
                        else
                            validaNombre = proxy.ValidarNombreLabor(this.atxtNombre.Text, int.Parse(this.ddlCuadrante.SelectedValue), int.Parse(this.hidCodigo.Value));

                        if (!validaNombre)
                        {
                            if (this.ddlTipoLabor.SelectedValue.CompareTo(System.Configuration.ConfigurationManager.AppSettings["codigoTipoLaborChimenea"]) == 0)
                                sb.AppendLine("El nombre de Labor " + " " + " de chimenea con dirección " + this.txtDireccion.Text.Trim() + " ya existe. ");
                            else
                                sb.AppendLine("El nombre de Labor " + " " + " para cuadrante " + this.ddlCuadrante.SelectedValue.ToString() + " ya existe. ");
                            retorno = false;
                        }
                    }
                }
                else
                {
                    sb.AppendLine("No se ha podido generar el Nombre de Labor.");
                    retorno = false;
                }

            }
            catch (Exception ex)
            {
                retorno = false;
                Logger.Error("Labor:Validar", ex);
            }
            return retorno;
        }

        protected override void Guardar()
        {
            try
            {
                this.GenerarNombreLabor();

                //Se valida antes de grabar
                StringBuilder sb = new StringBuilder();
                if (!Validar(ref sb))
                {
                    MostrarMensajeValidacion(sb.ToString());
                    return;
                }

                Labor labor = new Labor();
                labor.CodigoLabor = int.Parse(this.hidCodigo.Value.Trim());
                labor.Nivel = this.atxtNivel.Text.Trim();
                labor.CodigoZona = int.Parse(this.ddlZona.SelectedValue.ToString());

                if (this.ddlCuerpo.SelectedValue.CompareTo("0") != 0)
                    labor.CodigoCuerpo = int.Parse(this.ddlCuerpo.SelectedValue.ToString());
                else
                    labor.CodigoCuerpo = null;

                labor.NombreLabor = this.atxtNombre.Text.Trim();
                labor.Seccion = int.Parse(this.atxtSeccion.Text.Trim());
                labor.CodigoCategoriaLabor = int.Parse(this.ddlCategoria.SelectedValue.ToString());
                labor.CodigoTipoLabor = int.Parse(this.ddlTipoLabor.SelectedValue.ToString());

                if (this.ddlDireccion.SelectedValue.CompareTo("0") != 0)
                    labor.CodigoDireccion = int.Parse(this.ddlDireccion.SelectedValue.ToString());
                else
                    labor.CodigoDireccion = null;

                labor.Cuadrante = short.Parse(this.ddlCuadrante.SelectedValue);
                if (this.txtDireccion.Text.Length == 0)
                    labor.DireccionChimenea = null;
                else
                    labor.DireccionChimenea = int.Parse(this.txtDireccion.Text);

                using (var proxy = new SELaborClient("BasicHttpBinding_ISELabor"))
                {
                    if (this.hidCodigo.Value.CompareTo("0") == 0)
                        proxy.Insertar(labor);
                    else
                        proxy.Modificar(labor);
                }

                MostrarMensaje(MSG_OK_GRABAR);
                Listar();

                this.mpRegistro.Hide();
            }
            catch (Exception ex)
            {
                MostrarMensaje(MSG_ERROR_GRABAR, enmTipoMensajeMostrar.Error);
                Logger.Error("Labor:Guardar", ex);
            }
        }

        private void CargarCuerpo()
        {
            try
            {
                using (var proxy = new SECuerpoClient("BasicHttpBinding_ISECuerpo"))
                {
                    var lista = proxy.ObtenerListItem1(int.Parse(this.ddlZona.SelectedValue)).ToList();
                    this.Bind(this.ddlCuerpo, lista);
                    this.ddlCuerpo.Items.Insert(0, new ListItem(Constantes.TipoSeleccion.NINGUNA, TipoDropDownList.Ninguno.GetHashCode().ToString()));
                }

            }
            catch (Exception ex)
            {

                Logger.Error("Labor:CargarCuerpo", ex);
            }
        }
        #endregion

        protected void ddlZona_SelectedIndexChanged(object sender, EventArgs e)
        {
            CargarCuerpo();
        }

        protected void ddlTipoLabor_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.hidTipoLabor.Value = string.Empty;
            this.hidDireccion.Value = string.Empty;
            if (this.ddlTipoLabor.SelectedValue.CompareTo(System.Configuration.ConfigurationManager.AppSettings["codigoTipoLaborChimenea"]) == 0)
            {
                this.txtDireccion.Visible = true;
                this.txtDireccion.Text = string.Empty;
                this.ddlDireccion.Visible = false;
                this.ddlDireccion.SelectedValue = "0";
            }
            else
            {
                this.txtDireccion.Visible = false;
                this.txtDireccion.Text = string.Empty;
                this.ddlDireccion.Visible = true;
                this.ddlDireccion.SelectedValue = "0";
            }
            //Obtengo tipo de Labor Nombre Corto
            try
            {
                using (var proxy = new SETipoLaborClient("BasicHttpBinding_ISETipoLabor"))
                {
                    var tipoLabor = proxy.Obtener(int.Parse(this.ddlTipoLabor.SelectedValue));
                    if (tipoLabor != null)
                        this.hidTipoLabor.Value = tipoLabor.NombreCorto;
                }
                GenerarNombreLabor();
            }
            catch (Exception ex)
            {
                Logger.Error("Labor:ddlTipoLabor_SelectedIndexChanged", ex);
            }
        }

        protected void rgLista_PageSizeChanged(object sender, GridPageSizeChangedEventArgs e)
        {
            this.Listar();
        }

        protected void ddlDireccion_SelectedIndexChanged(object sender, EventArgs e)
        {
            try
            {
                this.hidDireccion.Value = string.Empty;
                if (ddlDireccion.SelectedValue.CompareTo("0") != 0)
                {
                    using (var proxy = new SEDireccionLaborClient("BasicHttpBinding_ISEDireccionLabor"))
                    {
                        var direccionLabor = proxy.ObtenerDireccionLabor(int.Parse(this.ddlDireccion.SelectedValue));
                        if (direccionLabor != null)
                            this.hidDireccion.Value = direccionLabor.DescripcionCorta;
                    }
                }
                GenerarNombreLabor();
            }
            catch (Exception ex)
            {

                Logger.Error("Labor:ddlDireccion_SelectedIndexChanged", ex);
            }
        }

    }
}